/**
  ******************************************************************************
  * @file    esp8266.h
  * @author  ashuai0110
  * @version V2.4
  * @date    2024-09-10
  * @brief   ESP8266模组AT指令集
  *
  ******************************************************************************
  * @attention
  *
  * 版权声明:内容为编者(ashuai0110)原创,使用请注明出处,当然,你也可以不这样做^_^
  * 出处链接:https://gitee.com/ashuai0110/mcu_reuse_development_module.git
  *
  ******************************************************************************
  */

#ifndef __ESP8266_H
#define __ESP8266_H

#ifdef __cplusplus
extern "C" {
#endif

/* 包含头文件-----------------------------------------------------------------*/
#include "command_at.h"
#include "cJSON.h"

/**
 * @addtogroup devices
 * @{
 */

/**
 * @defgroup esp8266 esp8266
 * @{
 */

/* 宏定义---------------------------------------------------------------------*/
/**
 * @defgroup esp8266_global_macros esp8266 global macros
 * @{
 */

#define ESP8266_HEAD                        "AT+"  /*!< AT指令帧头 */
#define ESP8266_TAIL                        "\r\n" /*!< AT指令帧尾 */

/* 设置回显开关 */
#define ESP8266_W_ATE                       "ATE%d\r\n" /*!< 设置回显开关  0:关闭 1:开启 */
#define ESP8266_W_ATE_RET                   "OK"        /*!< 设置命令的回复 */

/* 设置WIFI模式 */
#define ESP8266_W_CWMODE                    "AT+CWMODE=%d\r\n" /*!< 设置WIFI模式  1:STA  2:AP */
#define ESP8266_W_CWMODE_RET                "OK"               /*!< 设置命令的回复 */
/* 设置WIFI参数并连接WIFI */
#define ESP8266_W_CWJAP                     "AT+CWJAP=\"%s\",\"%s\"\r\n" /*!< 设置WIFI参数  ssid  密码 */
#define ESP8266_W_CWJAP_RET                 "GOT IP"                     /*!< 设置命令的回复 */
/* 读取WIFI状态和信息 */
#define ESP8266_R_CWSTATE                   "AT+CWSTATE?\r\n" /*!< 获取WIFI状态和信息 */
#define ESP8266_R_CWSTATE_RET               "+CWSTATE:"       /*!< 读取命令的回复 */

/* 读取/设置时区和SNTP服务器 */
#define ESP8266_W_CIPSNTPCFG                "AT+CIPSNTPCFG=1,8,\"210.72.145.44\",\"cn.ntp.org.cn\",\"ntp.sjtu.edu.cn\"\r\n" /*!< 设置时区和SNTP服务器 中国北京时间 */
#define ESP8266_W_CIPSNTPCFG_RET            "OK"                 /*!< 设置命令的回复 */
#define ESP8266_R_CIPSNTPCFG                "AT+CIPSNTPCFG?\r\n" /*!< 读取时区和SNTP服务器 */
#define ESP8266_R_CIPSNTPCFG_RET            "+CIPSNTPCFG:"       /*!< 读取命令的回复 */
/* 读取SNTP时间 */
#define ESP8266_R_CIPSNTPTIME               "AT+CIPSNTPTIME?\r\n" /*!< 读取SNTP时间 */
#define ESP8266_R_CIPSNTPTIME_RET           "+CIPSNTPTIME:"       /*!< 读取命令的回复 */
/* 读取TCP/UDP/SSL连接信息 */
#define ESP8266_R_CIPSTATE                  "AT+CIPSTATE?\r\n" /*!< 读取TCP/UDP/SSL连接信息 */
#define ESP8266_R_CIPSTATE_RET              "+CIPSTATE:"       /*!< 读取命令的回复 */
/* 域名解析 */
#define ESP8266_R_CIPDOMAIN                 "AT+CIPDOMAIN=\"%s\"\r\n" /*!< 域名解析  网址 */
#define ESP8266_R_CIPDOMAIN_RET             "+CIPDOMAIN:"             /*!< 读取命令的回复 */
/* 设置连接模式 */
#define ESP8266_W_CIPMUX                    "AT+CIPMUX=%d\r\n" /*!< 设置连接模式  0:单连接  1:多连接 */
#define ESP8266_W_CIPMUX_RET                "OK"               /*!< 设置命令的回复 */
/* 建立TCP/UDP/SSL连接 */
#define ESP8266_W_CIPSTART                  "AT+CIPSTART=\"%s\",\"%s\",%d\r\n" /*!< 建立TCP/UDP/SSL连接  网络类型:"TCP","UDP"  远端ipv4地址  远端端口号 */
#define ESP8266_W_CIPSTART_RET              "CONNECT"                          /*!< 设置命令的回复 */
/* 关闭TCP/UDP/SSL连接 */
#define ESP8266_W_CIPCLOSE                  "AT+CIPCLOSE\r\n" /*!< 关闭TCP/UDP/SSL单连接 */
#define ESP8266_W_CIPCLOSE_RET              "CLOSED"          /*!< 设置命令的回复 */
/* 设置传输模式 */
#define ESP8266_W_CIPMODE                   "AT+CIPMODE=%d\r\n" /*!< 设置传输模式  0:普通传输模式  1:WIFI透传模式 */
#define ESP8266_W_CIPMODE_RET               "OK"                /*!< 设置命令的回复 */
/* 在普通传输模式或WIFI透传模式下发送数据 */
#define ESP8266_W_CIPSEND                   "AT+CIPSEND\r\n" /*!< WIFI透传模式下发送数据 */
#define ESP8266_W_CIPSEND_RET               ">"              /*!< 设置命令的回复 */
/* GET */
#define ESP8266_W_GET                       "GET %s\r\n" /*!< 发送GET请求  网址 */
/* 退出数据模式(普通传输模式或WIFI透传模式) */
#define ESP8266_W_EXIT                      "+++" /*!< 退出数据模式 发送前后需保证至少50ms没有数据传输 下一条AT指令应间隔1s再发 */
/* 设置本地TCP/SSL服务器超时时间 */
#define ESP8266_W_CIPSTO                    "AT+CIPSTO=%d\r\n" /*!< 设置本地TCP/SSL超时时间  0~7200s */
#define ESP8266_W_CIPSTO_RET                "OK"               /*!< 设置命令的回复 */

/**
 * @}
 */

/* 类型定义-------------------------------------------------------------------*/
/**
 * @defgroup esp8266_global_types esp8266 global types
 * @{
 */

typedef struct weather {
    uint8_t weatherCode; /*!< 天气代码 */
    uint8_t temperature; /*!< 温度℃ */
    uint16_t pressure;   /*!< 气压mb */
    uint8_t humidity;    /*!< 湿度% */
    uint8_t windScale;   /*!< 风力等级 */
} weather_t;

/**
  * @brief  esp8266 structure definition
  */
typedef struct esp8266 {
    cmd_at_t esp8266CmdAt; /*!< AT指令管理实例 */
    mw_time_t sntpTime;    /*!< sntp时间信息 */
    weather_t weather;     /*!< 天气信息 */
    uint8_t state;         /*!< 流程状态 */
} esp8266_t;

/**
 * @}
 */

/* 全局变量-------------------------------------------------------------------*/

/* 函数原型-------------------------------------------------------------------*/
/**
 * @addtogroup esp8266_global_functions
 * @{
 */

void esp8266_init(mw_rw_fn_t readFn, mw_rw_fn_t writeFn);

void esp8266_set_rec_flag(void);
esp8266_t *esp8266_get_this(void);

uint8_t esp8266_connect_wifi(void);
uint8_t esp8266_sntp(void);
uint8_t esp8266_tcp_get_weather(void);

/**
 * @}
 */

/**
 * @}
 */

/**
 * @}
 */

#ifdef __cplusplus
}
#endif

#endif /* esp8266.h */
